home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / docs / corsoguide / schermi-14.txt < prev    next >
Text File  |  1992-09-03  |  11KB  |  191 lines

  1. Gli schermi
  2.  
  3. Prima di utilizzare una qualsiasi risorsa Intuition occorre aprire
  4. l'intuition.library dato che utilizzeremo le sue funzioni. Bene iniziamo
  5. col descrivere gli schermi; nelle vecchie versioni del chip set di Amiga
  6. esistevano solo 4 risoluzioni possibili (320x256, 320x512, 640x256,
  7. 640x512) di cui due (quelle di ampiezza di 320 pixels) potevano arrivare a
  8. 32 colori su una palette di 4096 e utilizzare particolari modalità come
  9. l'EHB (Extra Half Brite) e l'HAM (Hold And Modify) che permettevano
  10. rispettivamente, con alcune limitazioni, di raggiungere 64 e 4096 colori,
  11. mentre quelle con 640 pixels di ampiezza dovevano accontentarsi di un
  12. massimo di 16 colori. L'avvento dell'ECS ha portato solo qualche nuova
  13. risoluzione, mentre la vera rivoluzione si è avuta con l'AGA, data la sua
  14. possibile riprogrammazione delle frequenze video si possono ottenere una
  15. miriade di nuove risoluzioni, tutte con un massimo di 256 colori su una
  16. palette di 16.7 milioni di colori circa, e tutte con la possibilità di
  17. utilizzare la modalità HAM8, che permette di visualizzare con qualche
  18. limitazione tutta la palette di 16.7 milioni (attenzione però non si tratta
  19. di true-color, anzi in questa modalità lo schermo viene memorizzato sempre
  20. con 8 bitplanes). Come già accennato, possono esistere più schermi
  21. contemporaneamente sul vostro video, ed inoltre gli schermi possono essere
  22. di due tipi: public e custom; gli schermi custom vengono utilizzati solo
  23. dai programmi che li creano, per cui le finestre visualizzate su di essi
  24. possono essere create solo dall'applicazione che ha aperto gli schermi; gli
  25. schermi public sono "pubblici", vale a dire che possono essere utilizzati
  26. anche da altre applicazioni; quindi una finestra creata da un programma, in
  27. cui non viene specificato su quale schermo essere visualizzata può andare a
  28. finire su uno di questi schermi public; uno schermo public è il workbench e
  29. prima della versione 2.0 del sistema era l'unico possibile.
  30. La struttura che identifica uno schermo e che ne contiene tutte le
  31. informazioni necessarie è la struttura Screen.
  32. Le funzioni principali di intuition.library che riguardano gli schermi sono
  33. OpenScreenTags(), OpenScreenTagList(), OpenScreen() e CloseScreen(); le
  34. prime tre servono per la creazione di uno schermo, mentre l'ultima per la
  35. sua chiusura e per liberare la memoria occupata da questo. Le prime due
  36. funzioni di apertura sono molto simili e sono state introdotte dalla
  37. versione 2.0 (V36) del sistema, perché usano un modo molto efficiente per
  38. il passaggio di parametri, denominato per "Tags" introdotto appunto nel 2.0
  39. e che ritroveremo in moltre altre funzioni di libreria; la creazione dei
  40. Tags è avvenuta nel 2.0 perché in quel momento ci si è posti il problema
  41. del passaggio di parametri; infatti prima i parametri per l'apertura dello
  42. schermo, venivano passati mediante una struttura NewScreen contenente le
  43. diverse caratteristiche di quest'ultimo; dato il radicale cambiamento del
  44. sistema nel 2.0 molti parametri sono stati aggiunti e quindi, si è posto
  45. l'accento sulla compatibilità con versioni future del sistema (infatti il
  46. NewScreen non valeva più a molto, ed è stato mantenuto per compatibilità
  47. con il vecchio sistema), per cui è stato creato il Tag; il Tag è una
  48. struttura di due elementi, di cui il primo contiene un valore
  49. identificatore che indica quale parametro si vuole passare, ed il secondo
  50. rappresenta il parametro vero e proprio; in questa maniera si può passare
  51. alla funzione una lista di tags che contengono i diversi parametri e, dato
  52. che il numero di tags è variabile, la compatibilità con il futuro è
  53. assicurata; in più se qualche parametro (ad esempio una vecchia chiamata
  54. con una nuova funzione) non dovesse essere passato, il sistema provvederà
  55. ad utilizzare un valore standard per  quella caratteristica. Come prima
  56. avevamo accennato esistono due funzioni per l'apertura dello schermo
  57. mediante tag, OpenScreenTags() e OpenScreenTagList(); la differenza
  58. consiste semplicemenete che, nella prima funzione i tags vengono passati
  59. come parametri della procedura, mentre nella seconda viene passato il
  60. puntatore ad un array di tags; dato che il numero di parametri con questo
  61. metodo è variabile, vi starete chiedendo come si fà ad indicare alla
  62. procedura che la lista è finita; per indicare che la lista è finita, basta
  63. semplicemente inserire come ultimo tag un codice speciale che indica
  64. appunto la fine della lista, ed è una costante di un file di inclusione:
  65.  
  66. TAG_END, oppure TAG_DONE
  67.  
  68. Dopo questa piccola parentesi, analizziamo le funzioni di apertura dello
  69. schermo:
  70.  
  71. schermo = OpenScreenTags(nuovoschermo,tagId1,tagVal1,TagId2,TagVal2,.....);
  72.  
  73. dove "schermo" è il puntatore alla struttura Screen identificante lo
  74. schermo creato, o NULL se l'operazione è fallita; "nuovoschermo" è il
  75. puntatore alla struttura NewScreen (utilizzando i tag può essere
  76. tranquillamente impostato a NULL) e dopo seguono la lista di tag degli
  77. attributi dello schermo che devono ultimare, lo ricordiamo, con TAG_END o
  78. TAG_DONE.
  79.  
  80. schermo = OpenScreenTagList(nuovoschermo,listatags);
  81.  
  82. dove "listatags" è il puntatore ad un array di strutture TagItem; TagItem è
  83. la struttura contenente i due valori del "tag" ed ha la seguente forma:
  84.  
  85. struct TagItem
  86. {
  87.   ULONG ti_Tag; /* codice dell'attributo */
  88.   ULONG ti_Data; /* valore dell'attributo */
  89. };
  90.  
  91. potete vedere i diversi utilizzi di OpenScreenTags e OpenScreenTagList negli
  92. esempi, ma oramai la differenza dovrebbe essere chiara.
  93.  
  94. schermo = OpenScreen(nuovoschermo);
  95.  
  96. OpenScreen è la vecchia funzione di apertura degli schermi, utilizzata
  97. normalmente prima della versione 2.0 del sistema ed il passaggio dei
  98. parametri avviene mediante la struttura NewScreen; vi è comunque la
  99. possibilità di sfruttare le nuove qualità degli schermi del 2.0 utilizzando
  100. questa funzione, mediante la struttura ExtNewScreen; questa struttura è
  101. praticamente identica a NewScreen fuorché che possiede un campo in più,
  102. presente alla fine della struttura, ed è un puntatore all'array di tags
  103. degli attributi per lo schermo secondo la modalità vista; la struttura
  104. ExtNewScreen deve possedere il bit NS_EXTENDED settato nel campo Type.
  105. In questa maniera se il programma gira con una versione del sistema
  106. operativo inferiore al 2.0 allora la struttura verrà interpretata come una
  107. comunissima NewScreen altrimenti, verrà considerato l'ultimo campo e verrano
  108. utilizzato gli attributi del 2.0; da notare che questa possibilita è
  109. presente dalla versione V37 del s.o.
  110. Come ultima funzione rimane da analizzare CloseScreen:
  111.  
  112. CloseScreen(schermo);
  113.  
  114. CloseScreen come potete immaginare provvede a chiudere uno schermo
  115. precedentemente aperto.
  116. Torniamo a parlare di schermi pubblici; per poter aprire uno schermo
  117. pubblico basta specificare, il tag SA_PubName con il nome pubblico da
  118. assegnare allo schermo, nella lista dei tag per la funzione OpenScreenTags;
  119. vi sono però molte altre funzioni di intuition che riguardano gli schermi
  120. pubblici e che servono per la loro gestione; se volete ad esempio utilizzare
  121. uno schermo "public", per aprire una finestra o altro, occorre avere il
  122. puntatore alla struttura Screen di quest'ultimo; la funzione che permette di
  123. ottenere il puntatore ad uno schermo pubblico con un determinato nome è
  124. LockPubScreen; questa funzione ha il compito anche di "bloccare"
  125. momentaneamente lo schermo in modo che nessun altro task o sistema ne possa
  126. modificare lo stato (chiudendolo ad esempio); in questa maniera si evita di
  127. aprire una finestra, proprio mentre il sistema chiude lo schermo (che
  128. porterebbe a risultati disastrosi, come potete ben immaginare).
  129. Una volta che avete eseguito tutte le operazioni che volevate sullo
  130. schermo pubblico occorre sbloccarlo mediante la funzione UnlockPubScreen.
  131. Come accennato la volta scorsa esiste uno schermo pubblico di default,
  132. che normalmente è il Workbench; lo schermo pubblico di default
  133. può però essere cambiato, mediante la funzione SetDeafultPubScreen, oppure
  134. si può conoscere quale sia mediante GetDefaultPubScreen.
  135. Vi è talvolta la necessità di accedere a tutti i public screens, per avere
  136. una lista completa da utilizzare in diversi modi (visualizzandola all'utente
  137. per una selezione ad esempio); in questo caso occorre utilizzare la funzione
  138. LockPubScreenList che blocca la lista di sistema desgli schermi pubblici;
  139. il nodo della lista è descritto mediante la struttura PubScreenNode
  140. definita in "intuition/screens.h"; una volta ultimata l'analisi sulla lista
  141. degli schermi pubblici bisogna liberarla mediante UnlockPubScreenList.
  142. Comunque non serve utilizzare direttamente le informazioni della lista, in
  143. quanto basta richiamare la funzione NextPubScreen che restituisce il
  144. prossimo schermo da esaminare; quando l'ultimo schermo è stato restituito
  145. la funzione ritornerà NULL.
  146.  
  147. DrawInfo e 3D Look
  148.  
  149. Dalla versione 2.0 del sistema si adotta uno speciale gioco di colori, per
  150. creare effetti tridimensionali nelle finestre e nei gadget; questi effetti
  151. 3D sono ottenuti associando ad un colore una definizione del genere "bordo
  152. ombra" o "bordo luminoso", in modo che il sistema sappia a quale colore
  153. ricorrere se deve disegnare un bordo illuminato o in ombra; nell'apertura di
  154. uno schermo, possono essere specificate in SA_Pens, quali penne corrispondano
  155. al colore "illuminato" o "ombra" ed altri; il parametro passato in SA_Pens
  156. è un array di WORD che contiene in una determinata posizione, che
  157. identifica di quale colore si parla, il codice della penna corrispondente;
  158. l'array deve terminare con ~0, per cui se si vuole utilizzare la
  159. definizione standard delle penne, basta specificare un array con solo ~0;
  160. se invece occorre utilizzare particolari colori, bisogna specificarli
  161. nell'array seguendo la tabella delle definizioni (vedere riquadro). L'array
  162. delle penne di uno schermo (dri_Pens) è contenuto nella struttura DrawInfo,
  163. che contiene tutte le informazioni per il corretto rendering dello schermo
  164. e del suo contenuto (dati sui font ecc.).
  165. Per ottenere il puntatore alla
  166. struttura DrawInfo di uno schermo, bisogna utilizzare la funzione
  167. GetScreenDrawInfo con parametro puntatore alla struttura Screen; una volta
  168. utilizzata, bisogna liberare tale struttura con FreeScreenDrawInfo.
  169.  
  170. La visuale
  171.  
  172. Nell'apertura dello schermo si può specificare un diverso tipo di overscan
  173. tra i seguenti:
  174. OSCAN_TEXT
  175. OSCAN_STANDARD
  176. OSCAN_MAX
  177. OSCAN_VIDEO
  178. Occorre quindi conoscere qual è la reale risoluzione dello schermo; per
  179. questo si può utilizzare la funzione QueryOverscan:
  180.  
  181. ris = QueryOverscan(screen_modeID,rettangolo,tipooverscan);
  182.  
  183. dove "ris" è una LONG che indica successo se ha un valore diverso da zero;
  184. "screen_modeID" è la ULONG che identifica il tipo di schermo; "rettangolo"
  185. è il puntatore ad una struttura Rectangle contenente i limiti dello
  186. schermo; attenzione, la struttura Rectangle non verrà creata dalla
  187. funzione, ma dovrete crearla voi e passare alla funzione il suo indirizzo
  188. (mediante l'operatore &) in modo che la funzione possa modificarne i campi;
  189. il parametro "tipooverscan" specifica il tipo di overscan, scelto fra uno
  190. tra quelli descritti prima.
  191.